package com.crm.dao.mapper.customMapper.opportunityManagerCustomMapper;

import com.crm.model.qo.contactManager.ContactQO;
import com.crm.model.qo.opportunityManager.OpportunityQO;
import com.crm.model.qo.opportunityManager.OpportunityStatusQO;
import com.crm.model.vo.contactManager.ContactVO;
import com.crm.model.vo.customerManager.CustomerVO;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import com.crm.model.vo.opportunityManager.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 商机管理
 */
public interface OpportunityCustomMapper {

    /**
     * 商机管理信息--管理员
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    List<OpportunityVO> selectOpportunityGlyList(@Param("opportunityQO")OpportunityQO opportunityQO, @Param("sortOrder")String sortOrder,
                                                 @Param("dateUnit") Integer dateUnit);

    /**
     * 商机管理信息--分公司
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    List<OpportunityVO> selectOpportunityFgsList(@Param("opportunityQO") OpportunityQO opportunityQO, @Param("sortOrder")String sortOrder,
                                                 @Param("dateUnit") Integer dateUnit);

    /**
     * 商机管理信息--普通用户
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    List<OpportunityVO> selectOpportunityPtyhList(@Param("opportunityQO")OpportunityQO opportunityQO, @Param("sortOrder")String sortOrder,
                                                  @Param("dateUnit") Integer dateUnit);

    /**
     * 客户详情商机管理
     * @param opportunityQO 客户id
     * @return
     */
    List<OpportunityCustomerVO> opportunityByCustomerIdList(@Param("opportunityQO")OpportunityQO opportunityQO);

    /**
     * 商机-商机详情-通过商机id查询
     * @param opportunityId 商机id
     * @return
     */
    OpportunityVO opportunityDetail(@Param("opportunityId")String opportunityId);

    /**
     *
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit  1本月 2本季度 3本年
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityStatusVO> oppStatusStatistics(@Param("name")String name,@Param("number")Integer number, @Param("dateUnit")Integer dateUnit,@Param("startTime")String startTime,@Param("endTime")String endTime,@Param("superAccountId")String superAccountId);

    /**
     * 商机产品比重
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param  dateUnit 1本月 2本季度 3本年
     * @param  superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppProductStatistics(@Param("name")String name,@Param("number")Integer number,@Param("dateUnit")Integer dateUnit,@Param("superAccountId") String superAccountId);

    /**
     * 管理模块 --商机分布--商机列表
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit 1本月 2本季度 3本年
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityStatisticsVO> selectOppStatistics(@Param("name")String name, @Param("number")Integer number, @Param("dateUnit")Integer dateUnit,@Param("superAccountId") String superAccountId);

    /**
     * 根据客户ID更新商机所有人ID、分公司ID
     * @Author pym
     * @Date  2021/4/8 15:19
     * @param customerId -客户ID
     * @param accountId -用户ID
     * @param companyId -公司ID
     * @param updatePeopleId -更新人ID
     * @param updateTm -更新时间
     * @return {@link {int}}
     */
    int updateOpportunityByCustomerId(@Param("customerId")String customerId, @Param("accountId")String accountId,
                                      @Param("companyId")String companyId, @Param("updatePeopleId")String updatePeopleId,
                                      @Param("updateTm") Date updateTm);

    /**
     * 通过商机id带出来合同需要的数据
     * @param opportunityId 商机id
     * @return
     */
    OpportunityContractDetailVO opportunityContractDetail(@Param("opportunityId") String opportunityId);

    /**
     * 管理员-商机状态统计
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    List<OpportunityStatusVO> adminOppStatusStatistics(@Param("opportunityStatusQO")OpportunityStatusQO opportunityStatusQO);

    /**
     * 管理员-业绩排名
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    List<PerformanceRankingVO> performanceRanking(@Param("opportunityStatusQO")OpportunityStatusQO opportunityStatusQO);

    /**
     * 查询成交额度
     * @param dateUnit  1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    BigDecimal selectTransactionAmount(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 查询会员新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewMembers(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 查询商机新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewOpportunity(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 查询赢单新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewWinOrder(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 查询待回款额度
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    BigDecimal selectAmountReturned(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 查询联系人新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewContact(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 查询电话量新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewCallVolume(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 商机合同占比
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppContractProportion(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 商机合同类型比例
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppContractTypeProportion(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 商机成交额比例
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppTurnoverProportion(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 商机拥有数排行
     * @param bs 1赢单排行  2总数排行
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityOfNumberVO> oppOfNumber(@Param("bs")Integer bs, @Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 商机状态个数跟进占比意向占比
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityFollowIntentionZbVO> opportunityFollowIntentionZb(@Param("dateUnit") int dateUnit,@Param("number") Integer number,@Param("companyId") String companyId,@Param("superAccountId") String superAccountId);

    /**
     * 个人业绩下的商机分析数量
     * @param dateUnit 1本月 2本季度 3本年
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param accountId 用户id
     * @return
     */
    List<OpportunityStatusVO> oppStatusStatisticsAdmin(@Param("dateUnit") Integer dateUnit, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("accountId") String accountId);

    /**
     * 商机管理   ----协作人
     * @param opportunityQO
     * @param sortOrder
     * @param dateUnit
     * @return
     */
    List<OpportunityVO> selectOpportunityXzrList(@Param("opportunityQO") OpportunityQO opportunityQO, @Param("sortOrder")String sortOrder,
                                                 @Param("dateUnit") Integer dateUnit);

    /**
     * 查询自己的商机总条数
     * @param opportunityQO
     * @param dateUnit
     * @return
     */
    Integer selectOpportunityPtyhListCount(@Param("opportunityQO")OpportunityQO opportunityQO, @Param("dateUnit")Integer dateUnit);

    /**
     * 查询自己协作的商机总条数
     * @param opportunityQO
     * @param dateUnit
     * @return
     */
    Integer selectOpportunityXzrListCount(@Param("opportunityQO")OpportunityQO opportunityQO, @Param("dateUnit")Integer dateUnit);


    /**
     * @Description: 根据商机名称查询数据
     * @Param: [opportunityName]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
    **/
    List<DataSearchResultVO> selectDataByOpportunityName(@Param("opportunityName")String opportunityName);

    /**
     * 根据联系人id查询商机
     * @param contactId 联系人id
     * @param orderString 分组类型
     * @return
     */
    List<OpportunityVO> opportunityDetailList(@Param("contactId")String contactId, @Param("orderString")String orderString);
}
